package pe.com.bbva.modpre.negocio.impl;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.rmi.RemoteException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.vaadin.ui.Window;

import pe.com.bbva.harecService.HarecService;
import pe.com.bbva.modpre.dominio.Ans;
import pe.com.bbva.modpre.dominio.Cliente;
import pe.com.bbva.modpre.dominio.Deuda;
import pe.com.bbva.modpre.dominio.EmpresaTop;
import pe.com.bbva.modpre.dominio.Equipo;
import pe.com.bbva.modpre.dominio.Estado;
import pe.com.bbva.modpre.dominio.ExcepcionDuracionCf;
import pe.com.bbva.modpre.dominio.General;
import pe.com.bbva.modpre.dominio.GrupoProducto;
import pe.com.bbva.modpre.dominio.HistorialDocumento;
import pe.com.bbva.modpre.dominio.HistorialOperacion;
import pe.com.bbva.modpre.dominio.HistorialSolicitud;
import pe.com.bbva.modpre.dominio.Integrante;
import pe.com.bbva.modpre.dominio.Lista;
import pe.com.bbva.modpre.dominio.Operacion;
import pe.com.bbva.modpre.dominio.OtroBanco;
import pe.com.bbva.modpre.dominio.PagoHaberes;
import pe.com.bbva.modpre.dominio.Parametro;
import pe.com.bbva.modpre.dominio.ProdServPeriodo;
import pe.com.bbva.modpre.dominio.Rating;
import pe.com.bbva.modpre.dominio.Rentabilidad;
import pe.com.bbva.modpre.dominio.Riesgo;
import pe.com.bbva.modpre.dominio.Segmento;
import pe.com.bbva.modpre.dominio.Situacion;
import pe.com.bbva.modpre.dominio.Solicitud;
import pe.com.bbva.modpre.dominio.Spread;
import pe.com.bbva.modpre.dominio.SpreadFinanciero;
import pe.com.bbva.modpre.dominio.TipoBanca;
import pe.com.bbva.modpre.dominio.TipoBancaTipoDoi;
import pe.com.bbva.modpre.dominio.TipoBancaTipoPlazo;
import pe.com.bbva.modpre.dominio.Usuario;
import pe.com.bbva.modpre.dominio.Valor;
import pe.com.bbva.modpre.dominio.VigenciaTasa;
import pe.com.bbva.modpre.exception.AdjuntarException;
import pe.com.bbva.modpre.exception.ValidacionException;
import pe.com.bbva.modpre.negocio.SolicitudService;
import pe.com.bbva.modpre.persistencia.ClienteDAO;
import pe.com.bbva.modpre.persistencia.DeudaDAO;
import pe.com.bbva.modpre.persistencia.EmpresaTopDAO;
import pe.com.bbva.modpre.persistencia.EstadoDAO;
import pe.com.bbva.modpre.persistencia.ExcepcionDuracionCfDAO;
import pe.com.bbva.modpre.persistencia.GeneralDAO;
import pe.com.bbva.modpre.persistencia.GrupoProductoDAO;
import pe.com.bbva.modpre.persistencia.HistorialDocumentoDAO;
import pe.com.bbva.modpre.persistencia.HistorialOperacionDAO;
import pe.com.bbva.modpre.persistencia.HistorialSolicitudDAO;
import pe.com.bbva.modpre.persistencia.IntegranteDAO;
import pe.com.bbva.modpre.persistencia.OperacionDAO;
import pe.com.bbva.modpre.persistencia.OtroBancoDAO;
import pe.com.bbva.modpre.persistencia.PagoHaberesDAO;
import pe.com.bbva.modpre.persistencia.ProdServPeriodoDAO;
import pe.com.bbva.modpre.persistencia.ProductoDAO;
import pe.com.bbva.modpre.persistencia.RatingDAO;
import pe.com.bbva.modpre.persistencia.RentabilidadDAO;
import pe.com.bbva.modpre.persistencia.RiesgoDAO;
import pe.com.bbva.modpre.persistencia.SegmentoDAO;
import pe.com.bbva.modpre.persistencia.SituacionDAO;
import pe.com.bbva.modpre.persistencia.SolicitudDAO;
import pe.com.bbva.modpre.persistencia.SpreadDAO;
import pe.com.bbva.modpre.persistencia.SpreadFinancieroDAO;
import pe.com.bbva.modpre.persistencia.TipoBancaDAO;
import pe.com.bbva.modpre.persistencia.TipoBancaTipoDoiDAO;
import pe.com.bbva.modpre.persistencia.TipoBancaTipoPlazoDAO;
import pe.com.bbva.modpre.persistencia.UsuarioDAO;
import pe.com.bbva.modpre.persistencia.VigenciaTasaDAO;
import pe.com.bbva.modpre.utileria.Constante;
import pe.com.bbva.modpre.utileria.ModpreUtil;
import pe.com.bbva.modpre.utileria.ReporteCSV;
import pe.com.bbva.modpre.utileria.ReporteExcel;
import pe.com.bbva.modpre.utileria.ReportePDF;
import pe.com.grupobbva.harecservice.BodyDatosGeneralesXPersonaRs;
import pe.com.grupobbva.harecservice.ObtenerDatosXPersonaResponseDocument;

@Service
@SuppressWarnings("serial")
public class SolicitudServiceImpl extends ConfiguracionServiceImpl implements SolicitudService{

	@Autowired
	ClienteDAO clienteDAO;
	@Autowired
	DataSource dataSource;
	@Autowired
	OperacionDAO operacionDAO;
	@Autowired
	SolicitudDAO solicitudDAO;
	@Autowired
	UsuarioDAO usuarioDAO;
	@Autowired	ProductoDAO productoDAO;
	@Autowired
	TipoBancaDAO tipoBancaDAO;
	@Autowired
	SegmentoDAO segmentoDAO;
	@Autowired
	EstadoDAO estadoDAO;
	@Autowired
	SituacionDAO situacionDAO;
	@Autowired
	HistorialSolicitudDAO historialSolicitudDAO;
	@Autowired
	HistorialOperacionDAO historialOperacionDAO;
	@Autowired
	HistorialDocumentoDAO historialDocumentoDAO;
	@Autowired
	IntegranteDAO integranteDAO;
	@Autowired
	VigenciaTasaDAO vigenciaTasaDAO;
	@Autowired
	TipoBancaTipoPlazoDAO tipoBancaTipoPlazoDAO;
	@Autowired
	TipoBancaTipoDoiDAO tipoBancaTipoDoiDAO;
	@Autowired
	GrupoProductoDAO grupoProductoDAO;
	@Autowired
	ExcepcionDuracionCfDAO excepcionDuracionCfDAO;
	@Autowired
	RatingDAO ratingDAO;
	@Autowired
	GeneralDAO generalDAO;
	@Autowired
	DeudaDAO deudaDAO;
	@Autowired
	RiesgoDAO riesgoDAO;
	@Autowired
	RentabilidadDAO rentabilidadDAO;
	@Autowired
	EmpresaTopDAO empresaTopDAO;
	@Autowired
	ProdServPeriodoDAO prodServPeriodoDAO;
	@Autowired
	SpreadFinancieroDAO spreadFinancieroDAO;
	@Autowired
	PagoHaberesDAO pagoHaberesDAO;
	@Autowired
	SpreadDAO spreadDAO;
	@Autowired
	OtroBancoDAO otroBancoDAO;
	
	@Override
	public List<Cliente> busquedaCliente(Cliente cliente) {
		return clienteDAO.buscarClientes(cliente);
	}
	
	
	@Override
	public Map<String, List<Operacion>> obtenerMapaSolicitudes(Map<String, Object> mapFiltro) {
		List<Operacion> operaciones =operacionDAO.busquedaFiltrada(mapFiltro);
		Map<String, List<Operacion>> map=new LinkedHashMap<String, List<Operacion>>();
		List<Operacion> ope=null;
		for (Operacion operacion : operaciones) {
			if(map.containsKey(operacion.getSolicitud().getNumero())){
				ope=map.get(operacion.getSolicitud().getNumero());
				ope.add(operacion);
				map.put(operacion.getSolicitud().getNumero(), ope);
			}else{
				ope=new ArrayList<Operacion>();
				ope.add(operacion);
				map.put(operacion.getSolicitud().getNumero(), ope);
			}
		}
		return map;
	}


	@Override
	public Map<String, List<Operacion>> obtenerMapaSolicitudesBandeja(
			Map<String, Object> mapFiltro) {
		Usuario usuario=ModpreUtil.obtenerUsuarioSesion();
		Map<String, List<Operacion>> map=new LinkedHashMap<String, List<Operacion>>();
		if(usuario.getEquipo()!=null){
			Object[] equipos=equipoDAO.obtenerEquiposLista(usuario.getEquipo().getCodigo());
			mapFiltro.put("equipos", equipos);
			if(usuario.getEquipo().getCodigo().equals("GER_OFI_TER") || usuario.getEquipo().getCodigo().equals("GER_OFI_REG") ){
			mapFiltro.put("oficina", "oficina");
			}
			List<Operacion> operaciones =operacionDAO.busquedaFiltradaBandeja(mapFiltro);
			List<Operacion> ope=null;
			for (Operacion operacion : operaciones) {
				if(map.containsKey(operacion.getSolicitud().getNumero())){
					ope=map.get(operacion.getSolicitud().getNumero());
					ope.add(operacion);
					map.put(operacion.getSolicitud().getNumero(), ope);
				}else{
					ope=new ArrayList<Operacion>();
					ope.add(operacion);
					map.put(operacion.getSolicitud().getNumero(), ope);
				}
			}
		}
		return map;
	}
	
	@Override
	public List<Usuario> listaUsuarios() {
		return usuarioDAO.obtenerTodos();
	}

	@Override
	public List<Solicitud> busquedaxResponsable(Usuario usuario) {
		return solicitudDAO.listaSolicitudesResponsable(usuario);
	}


	@Override
	public void cambiarResponsableSol(List<Operacion> listaOperacion,List<Solicitud> listaSolicitud) {
			operacionDAO.grabarTodos(listaOperacion);
			solicitudDAO.grabarTodos(listaSolicitud);
		
	}

	@Override
	public List<Operacion> obtenerOperacionesxNumeroSolicitud(Solicitud solicitud) {
		List<Operacion> operaciones = operacionDAO.operacionxSolicitud(solicitud);
		return operaciones;
	}

	@Override
	public List<HistorialDocumento> obtenerHistorialDocumentoxSolicitud(
			Solicitud solicitud) {
		return historialDocumentoDAO.obtenerHistorialDocumentosxSolicitud(solicitud);
	}

	@Override
	@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
	public Solicitud obtenerSolicitud(Long id) {
		
		Solicitud solicitud= solicitudDAO.obtener(id);
		solicitud.getCreador().getId();
		return solicitud;
	}


	@Override
	public void registrarModificarSol(Solicitud solicitud,List<Operacion> listaOperacion) {
		
		if(!(solicitud.getId()!=null)){
			solicitudDAO.crear(solicitud);
		}else{
			solicitudDAO.actualizar(solicitud);
		}
		Usuario usuario=ModpreUtil.obtenerUsuarioSesion();
		for (Operacion operacion : listaOperacion) {
			operacion.setSolicitud(solicitud);
			operacion.setEquipo(usuario.getEquipo());
			operacion.setResponsable(usuario);
			Situacion situacion=situacionDAO.obtenerSituacionxCodigo(Situacion.CODIGO.PRE_REGISTRO);
			operacion.setSituacion(situacion);
		}
		operacionDAO.grabarTodos(listaOperacion);
		
	}

	@Override
	public List<TipoBanca> buscarTipoBancaxUsuario() {
		Usuario usuario=ModpreUtil.obtenerUsuarioSesion();
		return tipoBancaDAO.buscarTipoBancaxUsuario(usuario);
	}


	@Override
	public List<Segmento> buscarSegmentoxTipoBanca(String codigo) {
		return segmentoDAO.buscarSegmentoxTipoBanca(codigo);
	}


	@Override
	@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
	public Cliente obtenerClientexDOI(Cliente cliente, TipoBanca tipoBanca, Window window) {
		Valor tipoDoi=cliente.getTipoDoi();
		String nroDoi=cliente.getDoi();
		
		Parametro rutaWS=parametroDAO.obtenerParametroxCodigo(Parametro.CODIGO.RUTA_WS);
		Usuario usuario=ModpreUtil.obtenerUsuarioSesion();
		HarecService harecService=new HarecService();
		harecService.setUrl(rutaWS.getValor());
		
		ObtenerDatosXPersonaResponseDocument obtenerDatosXPersonaResponseDocument=null;
		try {
			//obtenerDatosXPersonaResponseDocument=harecService.obtenerDatosPorDocumento("P007397",tipoDoi.getCodigo(), nroDoi);
			obtenerDatosXPersonaResponseDocument=harecService.obtenerDatosPorDocumento(usuario.getRegistro(),tipoDoi.getCodigo(), nroDoi);
		} catch (RemoteException e) {
			e.printStackTrace();
		}
		
		cliente=clienteDAO.obtenerClientexDOI(cliente);
		if(obtenerDatosXPersonaResponseDocument!=null && 
				obtenerDatosXPersonaResponseDocument.getObtenerDatosXPersonaResponse().getHead().getCodigo().equals("0000") &&
				StringUtils.isNotBlank(obtenerDatosXPersonaResponseDocument.getObtenerDatosXPersonaResponse().getBody().getCodigoCentral())){
			BodyDatosGeneralesXPersonaRs body = obtenerDatosXPersonaResponseDocument.getObtenerDatosXPersonaResponse().getBody();
			if(cliente==null){
				cliente=new Cliente();
			}
			cliente.setTipoDoi(tipoDoi);
			cliente.setDoi(nroDoi);
			cliente.setNombres(body.getNombres());
			cliente.setPaterno(body.getApellidoPaterno());
			cliente.setMaterno(body.getApellidoMaterno());
			cliente.setCodigoCentral(body.getCodigoCentral());
			if(StringUtils.isNotBlank(body.getRegistro())){
				DateFormat fmt=new SimpleDateFormat("yyyy-MM-dd");
				Date fechaActual=new Date();
				Date fechaRegistro=null;
				try {
					fechaRegistro=fmt.parse(body.getRegistro());
				} catch (ParseException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				if(fechaRegistro!=null){
					long totalMinutos=0; 
					totalMinutos=((fechaActual.getTime()-fechaRegistro.getTime())/1000/60/60/24/360);
					cliente.setAntiguedadCliente(totalMinutos+"");
				}
			}else{
				cliente.setAntiguedadCliente("0");
			}
			cliente.setUbigeoCliente(body.getDistrito().getCodigo()+body.getProvincia().getCodigo()+
					body.getDepartamento().getCodigo());
			//cliente.setEsEmpresaTop(esEmpresaTop);
			cliente.setNombreCliente(body.getNombres()+" "+body.getApellidoPaterno()+" "+body.getApellidoMaterno());
			cliente.setCalificacionSbs(body.getClasificacionSBS().getNombre());
			cliente.setCalificacionBbva(body.getClasificacionBanco().getNombre());
			
			List<Valor> equiSegmento=null;
			if(tipoBanca.getCodigo().equals(TipoBanca.CODIGO.BEC)){
				equiSegmento=valorDAO.obtenerValoresxLista(Lista.CODIGO.SEGMENTO_BEC);
			} else if(tipoBanca.getCodigo().equals(TipoBanca.CODIGO.PARTICULAR)){
				equiSegmento=valorDAO.obtenerValoresxLista(Lista.CODIGO.SEGMENTO_PAR);
			} else{
				equiSegmento=valorDAO.obtenerValoresxLista(Lista.CODIGO.SEGMENTO_PYM);
			}
			
			String sSegmen = body.getSegmento().getCodigo();
			String sCodSegment = "";
			if(equiSegmento!=null && body.getSegmento() != null && body.getSegmento().getNombre()!= null){				
				for(Valor vEqSeg : equiSegmento){
					String[] arrCodigos = vEqSeg.getDescripcion().split(";");
					for(int icont=0; icont<arrCodigos.length; icont++ ){
						if(sSegmen.trim().equalsIgnoreCase(arrCodigos[icont])){
							sCodSegment = vEqSeg.getCodigo();
							break;
						}						
					}
					if(!sCodSegment.isEmpty()){
						break;
					}					
				}
			}			
			cliente.setSegmentoCliente(sCodSegment);
			
			if(cliente.getId()==null){
				clienteDAO.crear(cliente);
			}else{
				clienteDAO.actualizar(cliente);
			}
		}else if(cliente==null){
			resolverAlertaException(new ValidacionException(Constante.CODIGO_MENSAJE.VALIDAR_EXISTE_CLIENTE,new Object[]{}), window);
			return null;
		}
		
		return cliente;
	}

	@Override
	public Cliente obtenerClientexCodigoCentral(Cliente cliente, TipoBanca tipoBanca, Window window) {		
		Parametro rutaWS=parametroDAO.obtenerParametroxCodigo(Parametro.CODIGO.RUTA_WS);
		Usuario usuario=ModpreUtil.obtenerUsuarioSesion();
		HarecService harecService=new HarecService();
		harecService.setUrl(rutaWS.getValor());
		
		ObtenerDatosXPersonaResponseDocument obtenerDatosXPersonaResponseDocument=null;
		try {
			//obtenerDatosXPersonaResponseDocument=harecService.obtenerDatosPorCentro("P012273", cliente.getCodigoCentral());
			obtenerDatosXPersonaResponseDocument=harecService.obtenerDatosPorCentro(usuario.getRegistro(), cliente.getCodigoCentral());
		} catch (RemoteException e) {
			e.printStackTrace();
		}
		
		cliente=clienteDAO.obtenerClientexCodigoCentral(cliente);
		if(obtenerDatosXPersonaResponseDocument!=null && 
				obtenerDatosXPersonaResponseDocument.getObtenerDatosXPersonaResponse().getHead().getCodigo().equals("0000") &&
				StringUtils.isNotBlank(obtenerDatosXPersonaResponseDocument.getObtenerDatosXPersonaResponse().getBody().getCodigoCentral()) &&
				StringUtils.isNotBlank(obtenerDatosXPersonaResponseDocument.getObtenerDatosXPersonaResponse().getBody().getDoi().getTipo())){
			BodyDatosGeneralesXPersonaRs body = obtenerDatosXPersonaResponseDocument.getObtenerDatosXPersonaResponse().getBody();
			if(cliente==null){
				cliente=new Cliente();
			}
			cliente.setTipoDoi(valorDAO.obtenerValorxCodigo(body.getDoi().getTipo()));
			cliente.setDoi(body.getDoi().getNumero());
			cliente.setNombres(body.getNombres());
			cliente.setPaterno(body.getApellidoPaterno());
			cliente.setMaterno(body.getApellidoMaterno());
			cliente.setCodigoCentral(body.getCodigoCentral());
			if(StringUtils.isNotBlank(body.getRegistro())){
				DateFormat fmt=new SimpleDateFormat("yyyy-MM-dd");
				Date fechaActual=new Date();
				Date fechaRegistro=null;
				try {
					fechaRegistro=fmt.parse(body.getRegistro());
				} catch (ParseException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				if(fechaRegistro!=null){
					long totalMinutos=0; 
					totalMinutos=((fechaActual.getTime()-fechaRegistro.getTime())/1000/60/60/24/360);
					cliente.setAntiguedadCliente(totalMinutos+"");
				}
			}else{
				cliente.setAntiguedadCliente("0");
			}
			cliente.setUbigeoCliente(body.getDistrito().getCodigo()+body.getProvincia().getCodigo()+
					body.getDepartamento().getCodigo());
			//cliente.setEsEmpresaTop(esEmpresaTop);
			cliente.setNombreCliente(body.getNombres()+" "+body.getApellidoPaterno()+" "+body.getApellidoMaterno());
			cliente.setCalificacionSbs(body.getClasificacionSBS().getNombre());
			cliente.setCalificacionBbva(body.getClasificacionBanco().getNombre());
			
			List<Valor> equiSegmento=null;
			if(tipoBanca.getCodigo().equals(TipoBanca.CODIGO.BEC)){
				equiSegmento=valorDAO.obtenerValoresxLista(Lista.CODIGO.SEGMENTO_BEC);
			} else if(tipoBanca.getCodigo().equals(TipoBanca.CODIGO.PARTICULAR)){
				equiSegmento=valorDAO.obtenerValoresxLista(Lista.CODIGO.SEGMENTO_PAR);
			} else{
				equiSegmento=valorDAO.obtenerValoresxLista(Lista.CODIGO.SEGMENTO_PYM);
			}
			
			String sSegmen = body.getSegmento().getCodigo();
			String sCodSegment = "";
			if(equiSegmento!=null && body.getSegmento() != null && body.getSegmento().getNombre()!= null){				
				for(Valor vEqSeg : equiSegmento){
					String[] arrCodigos = vEqSeg.getDescripcion().split(";");
					for(int icont=0; icont<arrCodigos.length; icont++ ){
						if(sSegmen.trim().equalsIgnoreCase(arrCodigos[icont])){
							sCodSegment = vEqSeg.getCodigo();
							break;
						}						
					}
					if(!sCodSegment.isEmpty()){
						break;
					}					
				}
			}			
			cliente.setSegmentoCliente(sCodSegment);
			
			if(cliente.getId()==null){
				clienteDAO.crear(cliente);
			}else{
				clienteDAO.actualizar(cliente);
			}
		}else if(cliente==null){
			resolverAlertaException(new ValidacionException(Constante.CODIGO_MENSAJE.VALIDAR_EXISTE_CLIENTE,new Object[]{}), window);
			return cliente;
		}
		
		return cliente;
	}
	
	@Override
	public List<Operacion> operacionxResponsable(Usuario usuario) {
		return operacionDAO.listaOperacionesxResponsable(usuario);
	}

	@Override
	public List<Operacion> buscarOperacionesSolicitudResponsable(
			Solicitud solicitud, Usuario responsable) {
		return operacionDAO.buscarOperacionesSolicitudResponsable(solicitud, responsable);
	}

	@Override
	public List<Operacion> buscarOperacionesSolicitudEquipo(
			Solicitud solicitud, Equipo equipo) {
		return operacionDAO.buscarOperacionesSolicitudEquipo(solicitud, equipo);
	}	

	@Override
	public void actualizarLeido(Solicitud solicitud, boolean leido) {
		solicitud.setLeido(leido);
		solicitudDAO.actualizar(solicitud);
	}
	
	@Override
	@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
	public void guardarSolicitud(Solicitud solicitud,
			List<Operacion> listaOperacion, List<List<HistorialDocumento>> listaHistorialDocumentos) {
		if(solicitud.getId()==null){
			Usuario usuario=ModpreUtil.obtenerUsuarioSesion();
			DateFormat fmt=new SimpleDateFormat("yyyyMM");
			String numero=solicitudDAO.obtenerUltimoNumeroSolicitud(usuario.getOficina()+fmt.format(new Date()));
			String numeroOperacion="";
			if(numero==null){
				solicitud.setNumero(usuario.getOficina()+fmt.format(new Date())+"0001");
				numeroOperacion=usuario.getOficina()+fmt.format(new Date())+"00001";
			}else{
				String correlativo=StringUtils.substring(numero, 10);
				Integer con=Integer.parseInt(correlativo);
				con++;
				solicitud.setNumero(usuario.getOficina()+fmt.format(new Date())+StringUtils.leftPad(con.toString(), 4, "0"));
				numeroOperacion=usuario.getOficina()+fmt.format(new Date())+StringUtils.leftPad(con.toString(), 5, "0");
			}
			solicitud.setEquipo(usuario.getEquipo());
			solicitud.setResponsable(usuario);
			solicitud.setCodigoOficina(usuario.getOficina());
			solicitud.setNombreOficina(usuario.getDescOficina());
			solicitud.setCodigoRegionTerritorio(usuario.getRegionTerritorio());
			solicitud.setNombreRegionTerritorio(usuario.getDescRegionTerritorio());
			Estado estado=estadoDAO.obtenerEstadoxCodigo(Estado.CODIGO.PRE_REGISTRO);
			solicitud.setEstado(estado);
			solicitud.setLeido(true);
			//Configuracion de Ans
			Ans ans=ansDAO.obtenerAnsxEquipo(usuario.getEquipo());
			solicitud.setAns(ans);
			solicitud.setFechaEstado(new Date());
			solicitudDAO.crear(solicitud);
			Situacion situacion=situacionDAO.obtenerSituacionxCodigo(Situacion.CODIGO.PRE_REGISTRO);
			int con=1;
			for (Operacion operacion : listaOperacion) {
				operacion.setNumero(operacion.getProducto().getNombreCorto()+numeroOperacion+StringUtils.leftPad(con+"", 2, "0"));
				operacion.setSolicitud(solicitud);
				operacion.setEquipo(usuario.getEquipo());
				operacion.setResponsable(usuario);
				operacion.setSituacion(situacion);
				operacion.setCadic(operacion.getProducto().getCadic());
				operacion.setComision(operacion.getProducto().getComision());
				operacion.setTipoImpositivo(operacion.getProducto().getTipoImpositivo());
				operacion.setRatioEficiencia(operacion.getProducto().getRatioEficiencia());
				con++;
			}
			operacionDAO.grabarTodos(listaOperacion);
			grabarHistorial(solicitud, usuario, usuario, null, listaOperacion, listaHistorialDocumentos);
		}else{
			Usuario usuario=ModpreUtil.obtenerUsuarioSesion();
			solicitud.setEquipo(usuario.getEquipo());
			solicitud.setResponsable(usuario);
			solicitud.setLeido(true);
			solicitudDAO.actualizar(solicitud);
			Situacion situacion=situacionDAO.obtenerSituacionxCodigo(Situacion.CODIGO.PRE_REGISTRO);
			for (Operacion operacion : listaOperacion) {
				operacion.setSolicitud(solicitud);
				operacion.setEquipo(usuario.getEquipo());
				operacion.setResponsable(usuario);
				operacion.setCadic(operacion.getProducto().getCadic());
				operacion.setComision(operacion.getProducto().getComision());
				operacion.setTipoImpositivo(operacion.getProducto().getTipoImpositivo());
				operacion.setRatioEficiencia(operacion.getProducto().getRatioEficiencia());
				if(operacion.getSituacion()==null){
					operacion.setSituacion(situacion);
				}
			}
			operacionDAO.grabarTodos(listaOperacion);
			grabarHistorial(solicitud, usuario, usuario, null, listaOperacion, listaHistorialDocumentos);
		}
	}

	@Override
	@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
	public void enviarSolicitud(Solicitud solicitud,
			List<Operacion> listaOperacion,
			List<List<HistorialDocumento>> listaHistorialDocumentos,
			String comentario) {
		if(solicitud.getId()==null){
			guardarSolicitud(solicitud, listaOperacion, new ArrayList<List<HistorialDocumento>>());
		}
		Usuario usuarioEnvio=ModpreUtil.obtenerUsuarioSesion();
		Usuario usuarioRecepcion=distribucionEquipo(usuarioEnvio);
		solicitud.setEquipo(usuarioRecepcion.getEquipo());
		solicitud.setResponsable(usuarioRecepcion);
		Estado estado=estadoDAO.obtenerEstadoxCodigo(Estado.CODIGO.ABIERTO);
		solicitud.setEstado(estado);
		solicitud.setLeido(false);
		solicitudDAO.actualizar(solicitud);
		for (Operacion operacion : listaOperacion) {
			operacion.setSolicitud(solicitud);
			operacion.setEquipo(usuarioRecepcion.getEquipo());
			operacion.setResponsable(usuarioRecepcion);
			Situacion situacion=situacionDAO.obtenerSituacionxCodigo(Situacion.CODIGO.SOLICITADO);
			operacion.setSituacion(situacion);
			operacion.setFechaEnvioPrecio(new Date());
		}
		operacionDAO.grabarTodos(listaOperacion);
		usuarioRecepcion=asignacionUsuario(listaOperacion);
		solicitud.setEquipo(usuarioRecepcion.getEquipo());
		solicitud.setResponsable(usuarioRecepcion);
		//Configuracion de Ans
		Ans ans=ansDAO.obtenerAnsxEquipo(usuarioRecepcion.getEquipo());
		solicitud.setAns(ans);
		solicitud.setFechaEstado(new Date());
		solicitudDAO.actualizar(solicitud);
		grabarHistorial(solicitud, usuarioEnvio, usuarioRecepcion, comentario, listaOperacion, listaHistorialDocumentos);
	}

	@Override
	public void cancelarSolicitud(Solicitud solicitud,
			List<Operacion> listaOperacion, String comentario,Valor motivo) {
		Usuario usuario=ModpreUtil.obtenerUsuarioSesion();
		solicitud.setEquipo(usuario.getEquipo());
		solicitud.setResponsable(usuario);
		solicitud.setMotivoCancelar(motivo);
		Estado estado=estadoDAO.obtenerEstadoxCodigo(Estado.CODIGO.CERRADO);
		solicitud.setEstado(estado);
		solicitud.setLeido(true);
		solicitudDAO.actualizar(solicitud);
		Situacion situacion=situacionDAO.obtenerSituacionxCodigo(Situacion.CODIGO.CANCELADO);
		for (Operacion operacion : listaOperacion) {
			operacion.setSolicitud(solicitud);
			operacion.setEquipo(usuario.getEquipo());
			operacion.setResponsable(usuario);
			operacion.setSituacion(situacion);
		}
		operacionDAO.grabarTodos(listaOperacion);
		solicitudDAO.actualizar(solicitud);
		grabarHistorial(solicitud, usuario, usuario, comentario, listaOperacion, new ArrayList<List<HistorialDocumento>>());
	}
	
	@Override
	@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
	public void reconsiderarSolicitud(Solicitud solicitud,
			List<Operacion> listaOperacion,
			List<List<HistorialDocumento>> listaHistorialDocumentos,
			String comentario) {
		Usuario usuarioEnvio=ModpreUtil.obtenerUsuarioSesion();
		Usuario usuarioRecepcion=distribucionEquipo(usuarioEnvio);
		solicitud.setEquipo(usuarioRecepcion.getEquipo());
		solicitud.setResponsable(usuarioRecepcion);
		Estado estado=estadoDAO.obtenerEstadoxCodigo(Estado.CODIGO.ABIERTO);
		solicitud.setEstado(estado);
		solicitud.setLeido(false);
		solicitudDAO.actualizar(solicitud);
		for (Operacion operacion : listaOperacion) {
			operacion.setEquipo(usuarioRecepcion.getEquipo());
			operacion.setResponsable(usuarioRecepcion);
			Situacion situacion=situacionDAO.obtenerSituacionxCodigo(Situacion.CODIGO.RECONSIDERADO);
			operacion.setSituacion(situacion);
		}
		operacionDAO.grabarTodos(listaOperacion);
		usuarioRecepcion=asignacionUsuario(listaOperacion);
		solicitud.setEquipo(usuarioRecepcion.getEquipo());
		solicitud.setResponsable(usuarioRecepcion);
		//Configuracion de Ans
		Ans ans=ansDAO.obtenerAnsxEquipo(usuarioRecepcion.getEquipo());
		solicitud.setAns(ans);
		solicitud.setFechaEstado(new Date());
		solicitudDAO.actualizar(solicitud);
		grabarHistorial(solicitud, usuarioEnvio, usuarioRecepcion, comentario, listaOperacion, listaHistorialDocumentos);
	}


	@Override
	@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
	public void subsanarSolicitud(Solicitud solicitud,
			List<Operacion> listaOperacion,
			List<List<HistorialDocumento>> listaHistorialDocumentos,
			String comentario) {
		Usuario usuarioEnvio=ModpreUtil.obtenerUsuarioSesion();
		Usuario usuarioRecepcion=distribucionEquipo(usuarioEnvio);
		solicitud.setEquipo(usuarioRecepcion.getEquipo());
		solicitud.setResponsable(usuarioRecepcion);
		Estado estado=estadoDAO.obtenerEstadoxCodigo(Estado.CODIGO.ABIERTO);
		solicitud.setEstado(estado);
		solicitud.setLeido(false);
		solicitudDAO.actualizar(solicitud);
		for (Operacion operacion : listaOperacion) {
			operacion.setEquipo(usuarioRecepcion.getEquipo());
			operacion.setResponsable(usuarioRecepcion);
			Situacion situacion=situacionDAO.obtenerSituacionxCodigo(Situacion.CODIGO.SUBSANADO);
			operacion.setSituacion(situacion);
		}
		operacionDAO.grabarTodos(listaOperacion);
		usuarioRecepcion=asignacionUsuario(listaOperacion);
		solicitud.setEquipo(usuarioRecepcion.getEquipo());
		solicitud.setResponsable(usuarioRecepcion);
		//Configuracion de Ans
		Ans ans=ansDAO.obtenerAnsxEquipo(usuarioRecepcion.getEquipo());
		solicitud.setAns(ans);
		solicitud.setFechaEstado(new Date());
		solicitudDAO.actualizar(solicitud);
		grabarHistorial(solicitud, usuarioEnvio, usuarioRecepcion, comentario, listaOperacion, listaHistorialDocumentos);
	}


	@Override
	@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
	public void dictaminarSolicitud(Solicitud solicitud,
			List<Operacion> listaOperacion,
			List<List<HistorialDocumento>> listaHistorialDocumentos,
			String comentario) {
		Usuario usuarioEnvio=ModpreUtil.obtenerUsuarioSesion();
		Usuario usuarioRecepcion=usuarioDAO.obtenerUsuarioxRegistro(solicitud.getCreador().getRegistro());
		usuarioRecepcion.setEquipo(equipoDAO.obtenerEquipoxUsuario(usuarioRecepcion));
		solicitud.setEquipo(usuarioRecepcion.getEquipo());
		solicitud.setResponsable(usuarioRecepcion);
		Estado estado=estadoDAO.obtenerEstadoxCodigo(Estado.CODIGO.ABIERTO);
		solicitud.setEstado(estado);
		solicitud.setLeido(false);
		solicitudDAO.actualizar(solicitud);
		for (Operacion operacion : listaOperacion) {
			operacion.setEquipo(usuarioRecepcion.getEquipo());
			operacion.setResponsable(usuarioRecepcion);
			Situacion situacion=situacionDAO.obtenerSituacionxCodigo(Situacion.CODIGO.DICTAMINADO);
			operacion.setSituacion(situacion);
			operacion.setFechaDictamen(new Date());
		}
		operacionDAO.grabarTodos(listaOperacion);
		List<Operacion> listaOperacionTotal=obtenerOperacionesxNumeroSolicitud(solicitud);
		usuarioRecepcion=asignacionUsuario(listaOperacionTotal);
		solicitud.setEquipo(usuarioRecepcion.getEquipo());
		solicitud.setResponsable(usuarioRecepcion);
		//Configuracion de Ans
		Ans ans=ansDAO.obtenerAnsxEquipo(usuarioRecepcion.getEquipo());
		solicitud.setAns(ans);
		solicitud.setFechaEstado(new Date());
		solicitudDAO.actualizar(solicitud);
		grabarHistorial(solicitud, usuarioEnvio, usuarioRecepcion, comentario, listaOperacion, listaHistorialDocumentos);
	}


	@Override
	@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
	public void observarSolicitud(Solicitud solicitud,
			List<Operacion> listaOperacion,
			List<List<HistorialDocumento>> listaHistorialDocumentos,
			String comentario) {
		Usuario usuarioEnvio=ModpreUtil.obtenerUsuarioSesion();
		Usuario usuarioRecepcion=usuarioDAO.obtenerUsuarioxRegistro(solicitud.getCreador().getRegistro());
		usuarioRecepcion.setEquipo(equipoDAO.obtenerEquipoxUsuario(usuarioRecepcion));
		solicitud.setEquipo(usuarioRecepcion.getEquipo());
		solicitud.setResponsable(usuarioRecepcion);
		Estado estado=estadoDAO.obtenerEstadoxCodigo(Estado.CODIGO.ABIERTO);
		solicitud.setEstado(estado);
		solicitud.setLeido(false);
		solicitudDAO.actualizar(solicitud);
		for (Operacion operacion : listaOperacion) {
			operacion.setEquipo(usuarioRecepcion.getEquipo());
			operacion.setResponsable(usuarioRecepcion);
			Situacion situacion=situacionDAO.obtenerSituacionxCodigo(Situacion.CODIGO.OBSERVADO);
			operacion.setSituacion(situacion);
		}
		operacionDAO.grabarTodos(listaOperacion);
		usuarioRecepcion=asignacionUsuario(listaOperacion);
		solicitud.setEquipo(usuarioRecepcion.getEquipo());
		solicitud.setResponsable(usuarioRecepcion);
		//Configuracion de Ans
		Ans ans=ansDAO.obtenerAnsxEquipo(usuarioRecepcion.getEquipo());
		solicitud.setAns(ans);
		solicitud.setFechaEstado(new Date());
		solicitudDAO.actualizar(solicitud);
		grabarHistorial(solicitud, usuarioEnvio, usuarioRecepcion, comentario, listaOperacion, listaHistorialDocumentos);
	}

	@Override
	@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
	public void observarSolicitudAval(Solicitud solicitud, String comentario) {
		Usuario usuarioEnvio=ModpreUtil.obtenerUsuarioSesion();
		HistorialSolicitud historialSolicitud=new HistorialSolicitud();
		historialSolicitud.setSolicitud(solicitud);
		historialSolicitud.setUsuarioEnvio(usuarioEnvio);
		historialSolicitud.setEquipoEnvio(usuarioEnvio.getEquipo());
		historialSolicitud.setUsuarioRecepcion(solicitud.getResponsable());
		historialSolicitud.setEquipoRecepcion(solicitud.getEquipo());
		historialSolicitud.setEstado(solicitud.getEstado());
		historialSolicitud.setFechaInicio(new Date());
		historialSolicitud.setFechaFin(new Date());
		historialSolicitud.setDetalle(comentario);
		historialSolicitud.setAval(true);
		historialSolicitudDAO.crear(historialSolicitud);
	}

	@Override
	@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
	public void cerrarSolicitud(Solicitud solicitud,
			List<Operacion> listaOperacion,List<Situacion> situaciones,
			List<List<HistorialDocumento>> listaHistorialDocumentos,
			String comentario) {
		if(solicitud.getId()==null){
			guardarSolicitud(solicitud, listaOperacion, new ArrayList<List<HistorialDocumento>>());
		}
		for (int i = 0; i < listaOperacion.size(); i++) {
			Operacion operacion=listaOperacion.get(i);
			operacion.setSituacion(situaciones.get(i));
		}
		Usuario usuario=ModpreUtil.obtenerUsuarioSesion();
		solicitud.setEquipo(usuario.getEquipo());
		solicitud.setResponsable(usuario);
		Estado estado=estadoDAO.obtenerEstadoxCodigo(Estado.CODIGO.CERRADO);
		solicitud.setEstado(estado);
		solicitudDAO.actualizar(solicitud);
		for (Operacion operacion : listaOperacion) {
			operacion.setSolicitud(solicitud);
			operacion.setTeaDictaminar(operacion.getTeaDictaminar()==null?operacion.getTeaMin():operacion.getTeaDictaminar());
			operacion.setEquipo(usuario.getEquipo());
			operacion.setResponsable(usuario);
		}
		operacionDAO.grabarTodos(listaOperacion);
		grabarHistorial(solicitud, usuario, usuario, comentario, listaOperacion, listaHistorialDocumentos);
	}

	@Override
	@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
	public void elevarSolicitud(Solicitud solicitud,
			List<Operacion> listaOperacion,
			List<List<HistorialDocumento>> listaHistorialDocumentos,
			String comentario, List<Long> operacionesElevar) {
		Usuario usuarioEnvio=ModpreUtil.obtenerUsuarioSesion();
		Usuario usuarioRecepcion=distribucionEquipo(usuarioEnvio);
		solicitud.setEquipo(usuarioRecepcion.getEquipo());
		solicitud.setResponsable(usuarioRecepcion);
		Estado estado=estadoDAO.obtenerEstadoxCodigo(Estado.CODIGO.ABIERTO);
		solicitud.setEstado(estado);
		solicitud.setLeido(false);
		solicitudDAO.actualizar(solicitud);
		for (Operacion operacion : listaOperacion) {
			if(operacionesElevar.contains(operacion.getId())){
				operacion.setSolicitud(solicitud);
				operacion.setEquipo(usuarioRecepcion.getEquipo());
				operacion.setResponsable(usuarioRecepcion);
				Situacion situacion=situacionDAO.obtenerSituacionxCodigo(Situacion.CODIGO.ELEVADO);
				operacion.setSituacion(situacion);
			}
		}
		operacionDAO.grabarTodos(listaOperacion);
		usuarioRecepcion=asignacionUsuario(listaOperacion);
		solicitud.setEquipo(usuarioRecepcion.getEquipo());
		solicitud.setResponsable(usuarioRecepcion);
		//Configuracion de Ans
		Ans ans=ansDAO.obtenerAnsxEquipo(usuarioRecepcion.getEquipo());
		solicitud.setAns(ans);
		solicitud.setFechaEstado(new Date());
		solicitudDAO.actualizar(solicitud);
		grabarHistorial(solicitud, usuarioEnvio, usuarioRecepcion, comentario, listaOperacion, listaHistorialDocumentos);
	}

	@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
	private void grabarHistorial(Solicitud solicitud, Usuario usuarioEnvio, Usuario usuarioRecepcion, 
			String comentario, List<Operacion> listaOperacion, List<List<HistorialDocumento>> listaHistorialDocumentos){
		HistorialSolicitud historialSolicitud=new HistorialSolicitud();
		historialSolicitud.setSolicitud(solicitud);
		historialSolicitud.setUsuarioEnvio(usuarioEnvio);
		historialSolicitud.setEquipoEnvio(usuarioEnvio.getEquipo());
		historialSolicitud.setUsuarioRecepcion(usuarioRecepcion);
		historialSolicitud.setEquipoRecepcion(usuarioRecepcion.getEquipo());
		historialSolicitud.setEstado(solicitud.getEstado());
		historialSolicitud.setFechaInicio(new Date());
		historialSolicitud.setFechaFin(new Date());
		historialSolicitud.setDetalle(comentario);
		historialSolicitudDAO.crear(historialSolicitud);
		Valor estadoHistorial=obtenerValorxCodigo(Valor.CODIGO.ACTIVO);
		List<HistorialOperacion> historialOperaciones=new ArrayList<HistorialOperacion>();
		HistorialOperacion historialOperacion=null;
		for (Operacion operacion : listaOperacion) {
			historialOperacion=new HistorialOperacion();
			historialOperacion.setHistorialSolicitud(historialSolicitud);
			historialOperacion.setOperacion(operacion);
			historialOperacion.setTipoOperacion(operacion.getTipoOperacion());
			historialOperacion.setProducto(operacion.getProducto());
			historialOperacion.setMoneda(operacion.getMoneda());
			historialOperacion.setMontoCredito(operacion.getMontoCredito());
			historialOperacion.setPrecioBien(operacion.getPrecioBien());
			historialOperacion.setPlazo(operacion.getPlazo());
			historialOperacion.setTeaMin(operacion.getTeaMin());
			historialOperacion.setTeaEvaluar(operacion.getTeaEvaluar());
			historialOperacion.setSituacion(operacion.getSituacion());
			historialOperaciones.add(historialOperacion);
		}
		historialOperacionDAO.grabarTodos(historialOperaciones);
		List<HistorialDocumento> historialDocumentos=new ArrayList<HistorialDocumento>();
		for (int i = 0; i < listaHistorialDocumentos.size(); i++) {
			if(i==0){
				for (HistorialDocumento historialDocumento : listaHistorialDocumentos.get(i)) {
					if(historialDocumento.getId()==null){
						historialDocumento.setHistorialSolicitud(historialSolicitud);
						historialDocumento.setRuta(HistorialDocumento.RUTA.RUTA_TEMPORAL);
						historialDocumento.setEstado(estadoHistorial);
						historialDocumentos.add(historialDocumento);
					}
				}
			}else{
				for (HistorialDocumento historialDocumento : listaHistorialDocumentos.get(i)) {
					if(historialDocumento.getId()==null){	
						historialDocumento.setHistorialSolicitud(historialSolicitud);
						historialOperacion=historialOperaciones.get(i-1);
						historialDocumento.setHistorialOperacion(historialOperacion);
						historialDocumento.setRuta(HistorialDocumento.RUTA.RUTA_TEMPORAL);
						historialDocumento.setEstado(estadoHistorial);
						historialDocumentos.add(historialDocumento);
					}
				}
			}
		}
		historialDocumentoDAO.grabarTodos(historialDocumentos);
		adjuntarDocumentos(historialDocumentos);
	}
	
	@Override
	@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
	public void adjuntarDocumentos(List<HistorialDocumento> historialDocumentos) {
		Parametro parametro=obtenerParametroxCodigo(Parametro.CODIGO.ADJUNTOS_PATH);
		for (HistorialDocumento historialDocumento : historialDocumentos) {
			String directorio = parametro.getValor()+ModpreUtil.obtenerDirecctorios(historialDocumento.getId());
			
			File folder = new File(directorio);
			if(!folder.exists())
			{
				folder.mkdirs();
			}
			
			String nombreArhivoFisico = historialDocumento.getHistorialSolicitud().getSolicitud().getNumero()+
					HistorialDocumento.RUTA.SEPARADOR_NOMB_ARCHIVO+historialDocumento.getNombre();
			historialDocumento.setRuta(directorio+File.separatorChar+nombreArhivoFisico);
		}
		historialDocumentoDAO.grabarTodos(historialDocumentos);
		
		for (HistorialDocumento historialDocumento : historialDocumentos) {
			
			File file = new File(historialDocumento.getRuta());
			if(file.exists())
			{
				file.delete();
			}
			
			ByteArrayOutputStream arrayOutputStream=historialDocumento.getOutputStream();
			FileOutputStream outputStream = null;
			try {
				outputStream = new FileOutputStream(historialDocumento.getRuta());
			} catch (FileNotFoundException e) {
				throw new AdjuntarException(Constante.CODIGO_MENSAJE.VALIDAR_FOLDER_EXISTE, e);
			}
			try {
				arrayOutputStream.writeTo(outputStream);
			} catch (IOException e) {
				throw new AdjuntarException(Constante.CODIGO_MENSAJE.VALIDAR_ADJUNTO, 
						new Object[]{historialDocumento.getNombre()}, e);
			}
		}
	}
	
	@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
	private Usuario distribucionEquipo(Usuario usuario){
		Equipo equipo=usuario.getEquipo();
		
		if(equipo.getCodigo().equals(Equipo.CODIGO.EJE_BEC)){
			equipo=equipoDAO.obtenerEquipoxCodigo(Equipo.CODIGO.ANA_PRE_BEC);
		}else if(equipo.getCodigo().equals(Equipo.CODIGO.EJE_MIN)){
			equipo=equipoDAO.obtenerEquipoxCodigo(Equipo.CODIGO.ANA_PRE_MIN);
		}else if(equipo.getCodigo().equals(Equipo.CODIGO.ANA_PRE_BEC)){
			equipo=equipoDAO.obtenerEquipoxCodigo(Equipo.CODIGO.RES_PRE_BEC);
		}else if(equipo.getCodigo().equals(Equipo.CODIGO.ANA_PRE_MIN)){
			equipo=equipoDAO.obtenerEquipoxCodigo(Equipo.CODIGO.RES_PRE_MIN);
		}
		
		/*do {
			equipo=equipo.getPadre();
		} while (!(equipo.getCodigo().equals(Equipo.CODIGO.ANA_PRE_BEC) || 
				equipo.getCodigo().equals(Equipo.CODIGO.ANA_PRE_MIN)));*/
		
		Usuario usuarioRecepcion=usuarioDAO.obtenerUsuarioxDistribucion(equipo.getCodigo());
		usuarioRecepcion.setEquipo(equipo);
		
		return usuarioRecepcion;
	}
	
	@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
	private Usuario asignacionUsuario(List<Operacion> listaOperacion){
		Map<String, Integer> map= equipoDAO.obtenerNivelEquipos();//UBICARLO_LIM
		Usuario usuario=null;
		Situacion situacion=null;
		for (Operacion operacion : listaOperacion) {
			if(usuario==null){
				usuario=operacion.getResponsable();
				usuario.setEquipo(operacion.getEquipo());
				situacion=operacion.getSituacion();
			}else if(map.get(usuario.getEquipo().getCodigo()) < map.get(operacion.getEquipo().getCodigo()) && 
					!((operacion.getEquipo().getCodigo().equals(Equipo.CODIGO.EJE_BEC) || 
							operacion.getEquipo().getCodigo().equals(Equipo.CODIGO.EJE_MIN)) 
							&& operacion.getSituacion().getCodigo().equals(Situacion.CODIGO.DICTAMINADO))){
				usuario=operacion.getResponsable();
				usuario.setEquipo(operacion.getEquipo());
				situacion=operacion.getSituacion();
			}
			if((usuario.getEquipo().getCodigo().equals(Equipo.CODIGO.EJE_BEC) || 
					usuario.getEquipo().getCodigo().equals(Equipo.CODIGO.EJE_MIN)) 
					&& situacion.getCodigo().equals(Situacion.CODIGO.DICTAMINADO)){
				usuario=operacion.getResponsable();
				usuario.setEquipo(operacion.getEquipo());
				situacion=operacion.getSituacion();
			}
		}
		return usuario;
	}
	
	@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
	private Ans obtenerAns(Solicitud solicitud){
		
		return null;
	}
	
	@Override
	public HistorialSolicitud historialSolicitudUltimo(Solicitud solicitud) {
		return historialSolicitudDAO.historialSolicitudUltimo(solicitud);
	}


	@Override
	public Situacion obtenerSituacionxCodigo(String codigo) {
		return situacionDAO.obtenerSituacionxCodigo(codigo);
	}

	@Override
	public List<Integrante> listaIntegrantes() {
		return integranteDAO.obtenerTodos();
	}

	@Override
	public ByteArrayOutputStream generarReporte(int tipo,String [] cabecera,String titulo,List<String[]> filasTablas) {
		if(tipo==1){
			return ReporteExcel.exportarExcel(cabecera,titulo,filasTablas);
		}else if(tipo==2){
			return ReportePDF.exportarPDF(cabecera,titulo,filasTablas);
		}else{
			return ReporteCSV.exportarCSV(cabecera,titulo,filasTablas);
		}
	}
	@Override
	public void expirarSolicitudes() {
		List<Operacion> operaciones=operacionDAO.operacionExpirar();
		List<Solicitud> listSol = new ArrayList<Solicitud>();
//		List<Long> ids= new ArrayList<Long>();
		Solicitud sol = new Solicitud();
		sol.setId(null);
		for (Operacion operacion : operaciones) {
				if(!(operacion.getSolicitud().getId().equals(sol.getId()))){
					listSol.add(operacion.getSolicitud());
					sol.setId(operacion.getSolicitud().getId());
//					ids.add(operacion.getSolicitud().getId());
				}
				operacion.setSituacion(situacionDAO.obtenerSituacionxCodigo(Situacion.CODIGO.EXPIRADO));
		}
		operacionDAO.grabarTodos(operaciones);
		Estado estado=estadoDAO.obtenerEstadoxCodigo(Estado.CODIGO.CERRADO);
		boolean bandera=false;
		List<Solicitud> solCerrar=new ArrayList<Solicitud>();
		for (Solicitud solicitud : listSol) {
			List<Operacion> listaOperaciones =operacionDAO.operacionxSolicitud(solicitud);
			for (Operacion operacion : listaOperaciones) {
				if(!operacion.getSituacion().equals(Situacion.CODIGO.EXPIRADO)){
					bandera=false;
					break;
				}else{
					bandera=true;
				}
			}
			if(bandera){
				solicitud.setEstado(estado);
				solCerrar.add(solicitud);
			}
			
		}
		if(solCerrar.size()>0){
			solicitudDAO.grabarTodos(solCerrar);
		}
		
		/*solicitudDAO.grabarTodos(listSol);
		List<Operacion> listaOperaciones = operacionDAO.operacionFechaVigencia(ids);
		Situacion situacion=situacionDAO.obtenerSituacionxCodigo(Situacion.CODIGO.EXPIRADO);
		for (Operacion operacion : listaOperaciones) {
			System.out.println("operacion : " + operacion.getId());
			operacion.setSituacion(situacion);
		}*/
		
	}


	@Override
	public List<HistorialSolicitud> historialSolicitudxID(Solicitud solicitud) {
		return historialSolicitudDAO.historialSolicitudxID(solicitud);
	}


	@Override
	public List<HistorialOperacion> historialOperacionxHistorialSolicitud(Long idHistorialS) {
		return historialOperacionDAO.historialOperacionxHistorialSolicitud(idHistorialS);
	}


	@Override
	public List<HistorialDocumento> obtenerDocumento(HistorialOperacion historialOperacion) {
		return historialDocumentoDAO.obtenerDocumento(historialOperacion);
	}


	@Override
	public ByteArrayOutputStream generarReportePrevisualizar(int tipo,	Solicitud solicitud, List<Operacion> listaOperacion) {
		return ReportePDF.exportarPdfPrevisualizar(solicitud, listaOperacion);
	}


	@Override
	public VigenciaTasa obtenerVigenciaxProducto(Operacion operacion) {
		return vigenciaTasaDAO.obtenerVigenciaxProducto(operacion.getProducto());
	}


	@Override
	public List<TipoBanca> buscarTipoBanca() {
		// TODO Auto-generated method stub
		return tipoBancaDAO.obtenerTodos();
	}


	@Override
	public List<Valor> obtenerPlazoxBanca(TipoBanca tipoBanca) {
		List<TipoBancaTipoPlazo> listaTipoBancaPlazo =tipoBancaTipoPlazoDAO.buscarPlazoxBanca(tipoBanca);
		List<Valor> listaValorPlazo = new ArrayList<Valor>();
		for (TipoBancaTipoPlazo tipoBancaTipoPlazo : listaTipoBancaPlazo) {
			
			listaValorPlazo.add(tipoBancaTipoPlazo.getTipoPlazo());
			
		}
		return listaValorPlazo;
	}
	
	@Override
	public List<TipoBancaTipoDoi> obtenerDOIxBanca(TipoBanca tipoBanca) {
		return tipoBancaTipoDoiDAO.buscarDOIxBanca(tipoBanca);
	}


	@Override
	public void guardarTipoDoiTipoBanca(TipoBancaTipoDoi doixBanca) {
		// TODO Auto-generated method stub
		tipoBancaTipoDoiDAO.crear(doixBanca);
	}


	@Override
	public void guardarTipoPlazaTipoBanca(TipoBancaTipoPlazo plazaxBanca) {
		// TODO Auto-generated method stub
		tipoBancaTipoPlazoDAO.crear(plazaxBanca);
	}


	@Override
	public List<GrupoProducto> buscarGrupoProducto() {
		// TODO Auto-generated method stub
		return grupoProductoDAO.obtenerTodos();
	}


	@Override
	public void eliminarTipoPlazaTipoBanca(TipoBancaTipoPlazo plazaxBanca) {
			tipoBancaTipoPlazoDAO.eliminarxCodigo(plazaxBanca.getTipoPlazo());
	}


	@Override
	public void eliminarTipoDoiTipoBanca(TipoBancaTipoDoi doixBanca) {
			tipoBancaTipoDoiDAO.eliminarXId(doixBanca.getId());
	}


	@Override
	public List<Operacion> buscarOperacionesFiltrosReporte(Map<String, Object> mapFiltroReporte,Map<String, Object> mapFiltroTabla,TipoBanca tipoBanca) {
		return operacionDAO.buscarOperacionesFiltrosReporte(mapFiltroReporte,mapFiltroTabla,tipoBanca);
	}


	@Override
	public List<Valor> obtenerValoresOficina(String descripcion) {
		return valorDAO.valoresxDescripcion(descripcion);
	}


	@Override
	public List<Situacion> buscarSituacion() {
		return situacionDAO.obtenerTodos();
	}

	@Override
	public List<Valor> buscarDOIValorxBanca(TipoBanca tipoBanca) {
		return valorDAO.buscarDOIValorxBanca(tipoBanca);
	}


	@Override
	public void guardarDatosFinancieros(List<PagoHaberes> listaPagoHaberes,List<Spread> listaSpread,List<ProdServPeriodo> listaProdServPeriodo,List<Rating> listaRating,
			List<General> listaGeneral, List<Deuda> listaDeuda,
			List<Riesgo> listaRiesgo, List<Rentabilidad> listaRentabilidad, List<OtroBanco> listaOtrosBancos) {			
		if(listaOtrosBancos!=null){
			
		}
		if(listaPagoHaberes!=null){
			pagoHaberesDAO.grabarTodos(listaPagoHaberes);
		}
		if(listaSpread!=null){
			spreadDAO.grabarTodos(listaSpread);
		}
		if(listaProdServPeriodo!=null){
			prodServPeriodoDAO.grabarTodos(listaProdServPeriodo);
		}
		if(listaRating!=null){
			ratingDAO.grabarTodos(listaRating);
		}
		if(listaGeneral!=null){
			generalDAO.grabarTodos(listaGeneral);		
				}
		if(listaDeuda!=null){
			deudaDAO.grabarTodos(listaDeuda);
		}
		if(listaRiesgo!=null){
			riesgoDAO.grabarTodos(listaRiesgo);
		}
		if(listaRentabilidad!=null){
			rentabilidadDAO.grabarTodos(listaRentabilidad);
		}
		if(listaOtrosBancos!=null){
			otroBancoDAO.grabarTodos(listaOtrosBancos);
		}
		
	}
	
	@Override
	public List<ProdServPeriodo> obtenerProdServPeriodoxSolicitud(long id) {
		// TODO Auto-generated method stub
		return prodServPeriodoDAO.obtenerxSolicitud(id);
	}

	@Override
	public List<Rating> obtenerRatingxSolicitud(long id) {
		// TODO Auto-generated method stub
		return ratingDAO.obtenerxSolicitud(id);
	}


	@Override
	public List<Deuda> obtenerDeudaxSolicitud(long id) {
		// TODO Auto-generated method stub
		return deudaDAO.obtenerxSolicitud(id);
	}


	@Override
	public List<General> obtenerGeneralxSolicitud(long id) {
		// TODO Auto-generated method stub
		return generalDAO.obtenerxSolicitud(id);
	}


	@Override
	public List<Riesgo> obtenerRiesgoxSolicitud(long id) {
		// TODO Auto-generated method stub
		return riesgoDAO.obtenerxSolicitud(id);
	}


	@Override
	public List<Rentabilidad> obtenerRentabilidadxSolicitud(long id) {
		// TODO Auto-generated method stub
		return rentabilidadDAO.obtenerxSolicitud(id);
	}

	@Override
	public List<Integrante> integrantesxEquipo(String codigo) {
		// TODO Auto-generated method stub
		return integranteDAO.integrantesxEquipo(codigo);
	}

	@Override
	public List<Operacion> ListaOperConcretadas(Date primerDiaDelMes,Date ultimoDiaDelMes, String string) {
		return operacionDAO.buscarOperacionesConcretadas(primerDiaDelMes,ultimoDiaDelMes,string);
	}


	@Override
	public void guardarOperaciones(List<Operacion> operaciones) {
		operacionDAO.grabarTodos(operaciones);
	}


	@Override
	public void validarConcretadoDirecto(List<Operacion> listaOperacion) {
		for (Operacion operacion : listaOperacion) {
			if(operacion.getSituacion().getCodigo().equals(Situacion.CODIGO.CONCRETADO)){
				operacion.setConcretadoDirecto(historialOperacionDAO.esConcretadoDirecto(operacion.getId()));
			}
		}
		operacionDAO.grabarTodos(listaOperacion);
	}


	@Override
	public List<ExcepcionDuracionCf> buscarExcepcionDuracionCfs(
			Map<String, Object> map) {
		return excepcionDuracionCfDAO.buscarExcepcionDuracionCfs(map);
	}


	@Override
	public void guardarExcepcionDuracionCf(
			ExcepcionDuracionCf excepcionDuracionCf) {
		if(excepcionDuracionCf.getId()==null){
			excepcionDuracionCfDAO.crear(excepcionDuracionCf);
		}else{
			excepcionDuracionCfDAO.actualizar(excepcionDuracionCf);
		}
	}


	@Override
	public void eliminarExcepcionDuracionCf(Long id) {
		excepcionDuracionCfDAO.eliminarXId(id);
	}


	@Override
	public List<SpreadFinanciero> obtenerSpreadFinanciero(String spread1,SpreadFinanciero spread) {
		return spreadFinancieroDAO.obtenerTiposSpreadFinanciero(spread1,spread);
	}


	@Override
	public List<PagoHaberes> obtenerPagoHaberesxSolicitud(long id) {
		// TODO Auto-generated method stub
		return pagoHaberesDAO.obtenerxSolicitud(id);
	}


	@Override
	public List<Spread> obtenerSpreadxSolicitud(long id) {
		// TODO Auto-generated method stub
		return spreadDAO.obtenerxSolicitud(id);
	}


	@Override
	public EmpresaTop obtenerEmpresaxNombre(String nombre) {
		return empresaTopDAO.obtenerEmpresaTopxNombre(nombre);
	}


	@Override
	public List<OtroBanco> obtenerOtroBancoxSolicitud(long id) {
		return otroBancoDAO.obtenerxSolicitud(id);
	}

}
